﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Factory
{
    public partial class ManterCliente : Form
    {
        double limiteAtualCliente = 0;
        double limiteAprovadoAnterior = 0;

        #region Events
        public ManterCliente()
        {
            InitializeComponent();
        }

        private void ManterCliente_Load(object sender, EventArgs e)
        {
            Utils.LimpaCampos(this);
            CarregarClientes();
        }

        private void btnVoltar_Click_1(object sender, EventArgs e)
        {
            this.Close();
            MenuPrincipal menuprincipal = new MenuPrincipal();
            menuprincipal.Show();
        }

        private void btn_Limpar_Click_1(object sender, EventArgs e)
        {
            Utils.LimpaCampos(this);
        }

        private void btn_Excluir_Click_1(object sender, EventArgs e)
        {
            if (txtCod.Text != string.Empty)
            {
                if (MessageBox.Show("Deseja realmente excluir o usuário?", "Exclusão", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    ChequeDAO chequeDAO = new ChequeDAO();
                    IList<Cheque> lstCheques = chequeDAO.ObterChequePorDocumentoCliente(txtCPF.Text);

                    if (lstCheques.Count() > 0)
                    {
                        MessageBox.Show("Não é possível excluir cliente, pois o mesmo já recebeu empréstimos!");
                    }

                    else
                    {
                        ClienteDAO clienteDAO = new ClienteDAO();
                        int resultado = clienteDAO.ExcluirCliente(Convert.ToInt32(txtCod.Text));

                        if (resultado > 0)
                        {
                            MessageBox.Show("Cliente excluído com sucesso!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            CarregarClientes();
                            Utils.LimpaCampos(this);
                        }

                        else
                        {
                            MessageBox.Show("Problemas ao excluir o Cliente!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }
            }

            else
            {
                MessageBox.Show("Nenhum usuário selecionado para exclusão", "Problemas!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnSalvar_Click_1(object sender, EventArgs e)
        {
            try
            {
                bool podeAlterar = VerificaCampos();

                if (podeAlterar)
                {                  
                        ClienteDAO clienteDAO = new ClienteDAO();

                        double limite = (Convert.ToDouble(txtLimiteAprovado.Text) - limiteAprovadoAnterior) + limiteAtualCliente;

                        Cliente cliente = new Cliente(Convert.ToInt32(txtCod.Text), txtCPF.Text, Convert.ToDouble(txtLimiteAprovado.Text),
                            txtNomeUsuario.Text, rdbEspecial.Checked, rdbJuridica.Checked, limite);

                        int resultado = 0;

                        resultado = clienteDAO.atualizarCliente(cliente);

                        if (resultado > 0)
                        {
                            CarregarClientes();
                            Utils.LimpaCampos(this);
                            MessageBox.Show("Cliente alterado com sucesso!", "Sucesso!", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        }

                        else
                        {
                            MessageBox.Show("Problemas ao alterar cliente!", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        }
                }

                else
                {
                    MessageBox.Show(erro, "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            if (txtNomeBusca.Text != string.Empty && txtCodBusca.Text == string.Empty)
                BuscarPorNome();

            else if (txtCodBusca.Text != string.Empty && txtNomeBusca.Text == string.Empty)
                BuscarPorCod();

            else if (txtNomeBusca.Text != string.Empty && txtCodBusca.Text != string.Empty)
                BuscarPorNomeECod();
        }

        private void dataGridCliente_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                //verifico se o grid há linhas selecionadas
                if (dataGridCliente.CurrentRow != null)
                {
                    //capturo o codigo da grid
                    int cod = Convert.ToInt32(dataGridCliente.CurrentRow.Cells[0].Value);

                    //recupero o cliente que desejo alterar
                    var cliente = lstCliente.SingleOrDefault(x => x.id == cod);

                    //insiro seus valores nos controles
                    txtNomeUsuario.Text = cliente.nome;
                    txtLimiteAprovado.Text = cliente.limiteCredito.ToString();
                    txtCPF.Text = cliente.cpf;
                    txtCod.Text = cliente.id.ToString();
                    txtlimiteatual.Text = cliente.limiteAtual.ToString();
                    limiteAtualCliente = cliente.limiteAtual;
                    limiteAprovadoAnterior = cliente.limiteCredito;

                    rdbEspecial.Checked = cliente.especial;
                    rdbNormal.Checked = !cliente.especial;

                    rdbJuridica.Checked = cliente.juridica;
                    rdbFisica.Checked = !cliente.juridica;
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        #region Properties
        IList<Cliente> lstCliente = new List<Cliente>();
        string erro = string.Empty;
        #endregion

        #region Methods
        private void CarregarClientes()
        {
            try
            {
                ClienteDAO clienteDAO = new ClienteDAO();
                lstCliente = clienteDAO.ObterClientes();
                var lista = from c in lstCliente
                            select new
                            {
                                Id = c.id,
                                Nome = c.nome,
                                CPF = c.cpf,
                                Limite = c.limiteCredito,
                                LimiteAtual = c.limiteAtual,
                                Especial = c.especial,
                                Juridica = c.juridica,
                            };

                dataGridCliente.DataSource = lista.ToList();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private bool VerificaCampos()
        {
            if (txtCod.Text == string.Empty || txtNomeUsuario.Text == string.Empty || txtCPF.Text == string.Empty || txtLimiteAprovado.Text == string.Empty
                || (rdbEspecial.Checked == false && rdbNormal.Checked == false) || (rdbFisica.Checked == false && rdbJuridica.Checked == false))
            {
                StringBuilder sb = new StringBuilder();

                sb.Append("Os seguintes campos obrigatórios estão em branco: \n\n");
                sb.Append(txtCod.Text == string.Empty ? "-Código \n" : string.Empty);
                sb.Append(txtNomeUsuario.Text == string.Empty ? "-Nome \n" : string.Empty);
                sb.Append(txtCPF.Text == string.Empty ? "-CPF \n" : string.Empty);
                sb.Append(txtLimiteAprovado.Text == string.Empty ? "-Limite Aprovado \n" : string.Empty);
                sb.Append(rdbEspecial.Checked == false && rdbNormal.Checked == false ? "-Perfil \n" : string.Empty);
                sb.Append(rdbFisica.Checked == false && rdbJuridica.Checked == false ? "-Pessoa \n" : string.Empty);

                erro = sb.ToString();

                return false;
            }

            else
            {
                RegraDAO regraDAO = new RegraDAO();
                Regra regra = regraDAO.ObterRegras();
                double porcentagemEmprestimo = regra.PorcentagemEmprestimo;

                FactoryDAO factoryDAO = new FactoryDAO();
                FactoryE factory = factoryDAO.obterDadosFactory();

                //Calcula quanto sera o valor que a factory podera emprestar
                double valoraemprestar = ((factory.valorAtual / 100) * porcentagemEmprestimo);

                double porcentagemlimite = 0;
                if (rdbNormal.Checked == true)
                {
                    porcentagemlimite = regra.LimiteFactoryClienteComum;
                }
                else
                {
                    porcentagemlimite = regra.LimiteFactoryClienteEspecial;
                }

                double valoraemprestarcomporcentagem = ((valoraemprestar / 100) * porcentagemlimite);

                double limite = Convert.ToDouble(txtLimiteAprovado.Text);
                if (limite > valoraemprestarcomporcentagem)
                {
                    erro = "O limite do cliente está acima do permitido, tente outro valor!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

        protected override bool ProcessCmdKey(ref Message message, Keys keys)
        {
            switch (keys)
            {
                case Keys.Escape:
                    //Process action here.
                    MenuPrincipal menu = new MenuPrincipal();
                    menu.Show();
                    this.Hide();
                    return false;
            }

            return false;
        }

        private void BuscarPorNomeECod()
        {
            try
            {
                ClienteDAO clienteDAO = new ClienteDAO();
                lstCliente = clienteDAO.ObterClientes();
                var lista = from c in lstCliente
                            where c.nome.ToLower().Contains(txtNomeBusca.Text.ToLower()) && c.id == Convert.ToInt32(txtCodBusca.Text)
                            select new
                            {
                                Id = c.id,
                                Nome = c.nome,
                                CPF = c.cpf,
                                Limite = c.limiteCredito,
                                Especial = c.especial,
                                Juridica = c.juridica,
                            };

                dataGridCliente.DataSource = lista.ToList();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BuscarPorCod()
        {
            try
            {
                ClienteDAO clienteDAO = new ClienteDAO();
                lstCliente = clienteDAO.ObterClientes();
                var lista = from c in lstCliente
                            where c.id == Convert.ToInt32(txtCodBusca.Text)
                            select new
                            {
                                Id = c.id,
                                Nome = c.nome,
                                CPF = c.cpf,
                                Limite = c.limiteCredito,
                                Especial = c.especial,
                                Juridica = c.juridica,
                            };

                dataGridCliente.DataSource = lista.ToList();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BuscarPorNome()
        {


            try
            {
                ClienteDAO clienteDAO = new ClienteDAO();
                lstCliente = clienteDAO.ObterClientes();
                var lista = from c in lstCliente
                            where c.nome.ToLower().Contains(txtNomeBusca.Text.ToLower())
                            select new
                            {
                                Id = c.id,
                                Nome = c.nome,
                                CPF = c.cpf,
                                Limite = c.limiteCredito,
                                Especial = c.especial,
                                Juridica = c.juridica,
                            };

                dataGridCliente.DataSource = lista.ToList();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        private void rdbJuridica_CheckedChanged(object sender, EventArgs e)
        {

            if (rdbJuridica.Checked == true)
            {
                lblCPF.Text = "CNPJ";
                txtCPF.Mask = "00,000,000/0000-00";
                rdbFisica.Checked = false;
            }
        }

        private void rdbFisica_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbFisica.Checked == true)
            {
                lblCPF.Text = "CPF";
                txtCPF.Mask = "000,000,000-00";
                rdbJuridica.Checked = false;
            }
        }

        private void dataGridCliente_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}
